package org.jeecg.common.system.api;

import com.alibaba.fastjson.JSONObject;
import java.util.List;
import java.util.Set;
import org.jeecg.common.api.CommonAPI;
import org.jeecg.common.api.dto.OnlineAuthDTO;
import org.jeecg.common.api.dto.message.BusMessageDTO;
import org.jeecg.common.api.dto.message.BusTemplateMessageDTO;
import org.jeecg.common.api.dto.message.MessageDTO;
import org.jeecg.common.api.dto.message.TemplateDTO;
import org.jeecg.common.api.dto.message.TemplateMessageDTO;
import org.jeecg.common.system.vo.ComboModel;
import org.jeecg.common.system.vo.DictModel;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.system.vo.SysCategoryModel;
import org.jeecg.common.system.vo.SysDepartModel;

/** @Description 底层共通业务API，提供其他独立模块调用 @Author scott @Date 2019-4-20 @Version V1.0 */
public interface ISysBaseAPI extends CommonAPI {

  /**
   * 1发送系统消息
   *
   * @param message 使用构造器赋值参数 如果不设置category(消息类型)则默认为2 发送系统消息
   */
  void sendSysAnnouncement(MessageDTO message);

  /**
   * 2发送消息 附带业务参数
   *
   * @param message 使用构造器赋值参数
   */
  void sendBusAnnouncement(BusMessageDTO message);

  /**
   * 3通过模板发送消息
   *
   * @param message 使用构造器赋值参数
   */
  void sendTemplateAnnouncement(TemplateMessageDTO message);

  /**
   * 4通过模板发送消息 附带业务参数
   *
   * @param message 使用构造器赋值参数
   */
  void sendBusTemplateAnnouncement(BusTemplateMessageDTO message);

  /**
   * 5通过消息中心模板，生成推送内容
   *
   * @param templateDTO 使用构造器赋值参数
   * @return
   */
  String parseTemplateByCode(TemplateDTO templateDTO);

  /**
   * 6根据用户id查询用户信息
   *
   * @param id
   * @return
   */
  LoginUser getUserById(String id);

  /**
   * 7通过用户账号查询角色集合
   *
   * @param username
   * @return
   */
  List<String> getRolesByUsername(String username);

  /**
   * 8通过用户账号查询部门集合
   *
   * @param username
   * @return 部门 id
   */
  List<String> getDepartIdsByUsername(String username);

  /**
   * 9通过用户账号查询部门 name
   *
   * @param username
   * @return 部门 name
   */
  List<String> getDepartNamesByUsername(String username);

  /** 11查询所有的父级字典，按照create_time排序 */
  public List<DictModel> queryAllDict();

  /**
   * 12查询所有分类字典
   *
   * @return
   */
  public List<SysCategoryModel> queryAllDSysCategory();

  /**
   * 14查询所有部门 作为字典信息 id -->value,departName -->text
   *
   * @return
   */
  public List<DictModel> queryAllDepartBackDictModel();

  /**
   * 15根据业务类型及业务id修改消息已读
   *
   * @param busType
   * @param busId
   */
  public void updateSysAnnounReadFlag(String busType, String busId);

  /**
   * 16查询表字典 支持过滤数据
   *
   * @param table
   * @param text
   * @param code
   * @param filterSql
   * @return
   */
  public List<DictModel> queryFilterTableDictInfo(
      String table, String text, String code, String filterSql);

  /**
   * 17查询指定table的 text code 获取字典，包含text和value
   *
   * @param table
   * @param text
   * @param code
   * @param keyArray
   * @return
   */
  @Deprecated
  public List<String> queryTableDictByKeys(
      String table, String text, String code, String[] keyArray);

  /**
   * 18查询所有用户 返回ComboModel
   *
   * @return
   */
  public List<ComboModel> queryAllUserBackCombo();

  /**
   * 19分页查询用户 返回JSONObject
   *
   * @return
   */
  public JSONObject queryAllUser(String userIds, Integer pageNo, Integer pageSize);

  /**
   * 20获取所有角色
   *
   * @return
   */
  public List<ComboModel> queryAllRole();

  /**
   * 21获取所有角色 带参 roleIds 默认选中角色
   *
   * @return
   */
  public List<ComboModel> queryAllRole(String[] roleIds);

  /**
   * 22通过用户账号查询角色Id集合
   *
   * @param username
   * @return
   */
  public List<String> getRoleIdsByUsername(String username);

  /**
   * 23通过部门编号查询部门id
   *
   * @param orgCode
   * @return
   */
  public String getDepartIdsByOrgCode(String orgCode);

  /**
   * 24查询所有部门
   *
   * @return
   */
  public List<SysDepartModel> getAllSysDepart();

  /**
   * 25查找父级部门
   *
   * @param departId
   * @return
   */
  DictModel getParentDepartId(String departId);

  /**
   * 26根据部门Id获取部门负责人
   *
   * @param deptId
   * @return
   */
  public List<String> getDeptHeadByDepId(String deptId);

  /**
   * 27给指定用户发消息
   *
   * @param userIds
   * @param cmd
   */
  public void sendWebSocketMsg(String[] userIds, String cmd);

  /**
   * 28根据id获取所有参与用户 userIds
   *
   * @return
   */
  public List<LoginUser> queryAllUserByIds(String[] userIds);

  /**
   * 29将会议签到信息推动到预览 userIds
   *
   * @return
   * @param userId
   */
  void meetingSignWebsocket(String userId);

  /**
   * 30根据name获取所有参与用户 userNames
   *
   * @return
   */
  List<LoginUser> queryUserByNames(String[] userNames);

  /**
   * 31获取用户的角色集合
   *
   * @param username
   * @return
   */
  Set<String> getUserRoleSet(String username);

  /**
   * 32获取用户的权限集合
   *
   * @param username
   * @return
   */
  Set<String> getUserPermissionSet(String username);

  /**
   * 33判断是否有online访问的权限
   *
   * @param onlineAuthDTO
   * @return
   */
  boolean hasOnlineAuth(OnlineAuthDTO onlineAuthDTO);

  /** 34通过部门id获取部门全部信息 */
  SysDepartModel selectAllById(String id);

  /**
   * 35根据用户id查询用户所属公司下所有用户ids
   *
   * @param userId
   * @return
   */
  List<String> queryDeptUsersByUserId(String userId);

  /**
   * 36根据多个用户账号(逗号分隔)，查询返回多个用户信息
   *
   * @param usernames
   * @return
   */
  List<JSONObject> queryUsersByUsernames(String usernames);

  /**
   * 37根据多个用户ID(逗号分隔)，查询返回多个用户信息
   *
   * @param ids
   * @return
   */
  List<JSONObject> queryUsersByIds(String ids);

  /**
   * 38根据多个部门编码(逗号分隔)，查询返回多个部门信息
   *
   * @param orgCodes
   * @return
   */
  List<JSONObject> queryDepartsByOrgcodes(String orgCodes);

  /**
   * 39根据多个部门id(逗号分隔)，查询返回多个部门信息
   *
   * @param ids
   * @return
   */
  List<JSONObject> queryDepartsByIds(String ids);

  /**
   * 40发送邮件消息
   *
   * @param email
   * @param title
   * @param content
   */
  void sendEmailMsg(String email, String title, String content);
}
